package com.cn.practice.builder;

import lombok.Data;

/**
 * 建造者模式练习
 * 建造这模式核心要点-四大要素 产品，抽象建造者，具体建造者，协调者
 * 产品是需要最终建造的对象
 * 抽象建造着 抽象类 提供了一个需要建造的产品对象，一个的具体建造方法返回这个这个对象
 * 还有无数个抽象方法返回建造的流程
 * 具体建造者 实现了抽象建造者。不能重写建造方法。重写建造流程方法实现建造
 * 协调者里面包含了一个抽象建造者者对象，一个产品对象
 * 里面有一个返回值为产品的协调方法使用抽象建造者的建造流程方法自定义建造流程，
 * 最后调用抽象建造者的建造方法返回产品对象
 * @author 15790
 *
 */
public class BuilderTest {
	public static void main(String[] args) {
		//new一个建造者
		WoodHouseBuilder woodHouseBuilder = new WoodHouseBuilder();
		//new一个协调者
		HouseDirector director = new HouseDirector();
		House house = director.construct(woodHouseBuilder);
		System.out.println(house.toString());
		
	}
}

/**
 * 产品-房子
 * @author 15790
 *
 */
class House{
	private String basic;
	private String wall;
	private String roof;
	public String getBasic() {
		return basic;
	}
	public void setBasic(String basic) {
		this.basic = basic;
	}
	public String getWall() {
		return wall;
	}
	public void setWall(String wall) {
		this.wall = wall;
	}
	public String getRoof() {
		return roof;
	}
	public void setRoof(String roof) {
		this.roof = roof;
	}
	@Override
	public String toString() {
		return "House [basic=" + basic + ", wall=" + wall + ", roof=" + roof + "]";
	}
 
	
}
/**
 * 抽象建造者类
 * @author 15790
 *
 */
abstract class AbsHouseBuilder{
	House house=new House();
	public abstract void buildBaic();
	public abstract void buildWall();
	public abstract void buildRoof();
	public House buildHouse() {
		return house;
	}
	
}

/**
 * 具体建造者
 * @author 15790
 *
 */
class WoodHouseBuilder extends AbsHouseBuilder{

	@Override
	public void buildBaic() {
		// TODO Auto-generated method stub
		this.house.setBasic("地基3米");
	}

	@Override
	public void buildWall() {
		// TODO Auto-generated method stub
		this.house.setWall("木头");
	}

	@Override
	public void buildRoof() {
		// TODO Auto-generated method stub
		this.house.setRoof("瓦");
	}
	
}

/**
 * 协调者-协调建房子的流程
 * @author 15790
 *
 */
class HouseDirector{
	
	
	AbsHouseBuilder houseBuilder;

	public void setHouseBuilder(AbsHouseBuilder houseBuilder) {
		this.houseBuilder = houseBuilder;
	}

	public HouseDirector( ) {
		super();
	}
	
	/**
	 * 协调方法
	 * @param houseBuilder
	 */
	public House construct(AbsHouseBuilder houseBuilder) {
		houseBuilder.buildRoof();
		houseBuilder.buildWall();
		houseBuilder.buildBaic();
		return houseBuilder.buildHouse();
	}
}